package tp.algo2.futbol;

import com.google.common.base.Objects;
import java.util.List;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import tp.algo2.futbol.Jugador;
import tp.algo2.futbol.Partido;
import tp.algo2.futbol.TipoDeJugador;

@SuppressWarnings("all")
public class Estandar implements TipoDeJugador {
  public boolean puedeJugar(final Partido partido) {
    boolean _or = false;
    boolean _or_1 = false;
    boolean _partidoIncompleto = partido.partidoIncompleto();
    if (_partidoIncompleto) {
      _or_1 = true;
    } else {
      boolean _existeSolidario = this.existeSolidario(partido);
      _or_1 = (_partidoIncompleto || _existeSolidario);
    }
    if (_or_1) {
      _or = true;
    } else {
      boolean _existeCondicional = this.existeCondicional(partido);
      _or = (_or_1 || _existeCondicional);
    }
    return _or;
  }
  
  public boolean existeCondicional(final Partido partido) {
    boolean _xifexpression = null;
    List<Jugador> _jugadores = partido.getJugadores();
    final Function1<Jugador,Boolean> _function = new Function1<Jugador,Boolean>() {
        public Boolean apply(final Jugador j) {
          String _tipo = j.tipo();
          boolean _equals = Objects.equal(_tipo, "Condicional");
          return Boolean.valueOf(_equals);
        }
      };
    boolean _exists = IterableExtensions.<Jugador>exists(_jugadores, _function);
    if (_exists) {
      List<Jugador> _jugadores_1 = partido.getJugadores();
      final Function1<Jugador,Boolean> _function_1 = new Function1<Jugador,Boolean>() {
          public Boolean apply(final Jugador j) {
            String _tipo = j.tipo();
            boolean _equals = _tipo.equals("Condicional");
            return Boolean.valueOf(_equals);
          }
        };
      final Jugador soli = IterableExtensions.<Jugador>findFirst(_jugadores_1, _function_1);
      List<Jugador> _jugadores_2 = partido.getJugadores();
      _jugadores_2.remove(soli);
      return true;
    }
    return (_xifexpression).ObjectValue();
  }
  
  public boolean existeSolidario(final Partido partido) {
    boolean _xifexpression = null;
    List<Jugador> _jugadores = partido.getJugadores();
    final Function1<Jugador,Boolean> _function = new Function1<Jugador,Boolean>() {
        public Boolean apply(final Jugador j) {
          String _tipo = j.tipo();
          boolean _equals = Objects.equal(_tipo, "Solidario");
          return Boolean.valueOf(_equals);
        }
      };
    boolean _exists = IterableExtensions.<Jugador>exists(_jugadores, _function);
    if (_exists) {
      List<Jugador> _jugadores_1 = partido.getJugadores();
      final Function1<Jugador,Boolean> _function_1 = new Function1<Jugador,Boolean>() {
          public Boolean apply(final Jugador j) {
            String _tipo = j.tipo();
            boolean _equals = _tipo.equals("Solidario");
            return Boolean.valueOf(_equals);
          }
        };
      final Jugador soli = IterableExtensions.<Jugador>findFirst(_jugadores_1, _function_1);
      List<Jugador> _jugadores_2 = partido.getJugadores();
      _jugadores_2.remove(soli);
      return true;
    }
    return (_xifexpression).ObjectValue();
  }
  
  public String tipo() {
    return "Estandar";
  }
}
